package com.example.demospring5.primary.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * java7 JDK提供的动态历例
 *
 * 1.InvocationHandler（接口）
 * 2.Proxy（类）
 * @Author ifredomvip@gmail.com
 * @Date 2022/8/1 17:28
 * @Version 1.0.0
 * @Description
 **/

public class DynamicProxyJDKMethod implements InvocationHandler {


    private Object target;


    public DynamicProxyJDKMethod(Object target) {
        this.target = target;
    }

    public Object getProxy (){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    /**
     * 调用
     *
     * @param proxy  代理
     * @param method 方法
     * @param args   arg游戏
     * @return {@link Object}
     * @throws Throwable throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在真实的对象执行之前我们可以添加自己的操作
        System.out.println("before invoke。。。");
        String methodName = method.getName();
        System.out.println(methodName);
        Object result = method.invoke(target,args);
        //在真实的对象执行之后我们可以添加自己的操作
        System.out.println("after invoke。。。");
        return result;
    }
}
